package com.mdd.common.util;

import com.mdd.common.enums.CodeEnum;

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;

/**
 * 订单工具类
 * @author shenjian
 * @createTime 2023年02月10日 13:43:00
 */
public class OrderUtils {


    /** 生成订单号类
      * 使用单例模式，不允许直接创建实例
      */
    private OrderUtils() {
    }

    /** 创建一个空实例对象，类需要用的时候才赋值 */
    private static OrderUtils g = null;

    /** 单例模式--懒汉模式 */
    public static synchronized OrderUtils getInstance() {
        if (g == null) {
            g = new OrderUtils();
        }
        return g;
    }
    /** 格式化的时间字符串 */
    private static final DateTimeFormatter SDF = DateTimeFormatter.ofPattern("yyyyMMddHHmmssSSS");

    /** 订单类别头 */
    private static final String ORDER_CODE = "1";
    /** 退款类别头 */
    private static final String REFUND_ORDER = "3";

    /** 获取当前时间年月日时分秒毫秒字符串 */
    private static String getNowDateStr() {
        return LocalDateTime.now().format(SDF);
    }

    /** 随即编码 */
    private static final int[] r = new int[]{7, 9, 6, 2, 8 , 1, 3, 0, 5, 4};

    /** 用户id和随机数总长度 */
    private static final int maxLength = 7;

    /**
     * 生成一个订单号 - 支付平台使用
     * @param code 类别
     * @param userId 用户ID
     */
    public synchronized String generateOrder(CodeEnum code, Integer userId) {
        return code.getCode() + getNowDateStr() + toCode(userId);
    }

    /**
     * 更具id进行加密+加随机数组成固定长度编码
     */
    private static String toCode(Integer id) {
        String idStr = id.toString();
        StringBuilder idsbs = new StringBuilder();
        for (int i = idStr.length() - 1 ; i >= 0; i--) {
            idsbs.append(r[idStr.charAt(i)-'0']);
        }
        return idsbs.append(getRandom(maxLength - idStr.length())).toString();
    }

    /**
     * 生成固定长度随机码
     * @param n    长度
     */
    private static long getRandom(long n) {
        long min = 1,max = 9;
        for (int i = 1; i < n; i++) {
            min *= 10;
            max *= 10;
        }
        long rangeLong = (((long) (new Random().nextDouble() * (max - min)))) + min ;
        return rangeLong;
    }

    public static void main(String[] args) {
        final OrderUtils orderUtils = OrderUtils.getInstance();
        System.out.println(orderUtils.generateOrder(CodeEnum.ORDER_CODE, 3));
    }
}
